# Config

# Nombre del ejecutable.
target = tp

# Extensión 
extension = cpp

# Comentar si no se quiere ver como se invoca al compilador
verbose = si

# Opciones para el compilador C/C++ en modo ansi.
CFLAGS = -Wall -pedantic -pedantic-errors

# Optimizaciones y asserts
CFLAGS += -O3 -DNDEBUG

# Para valgrind o debug
CFLAGS += -ggdb -DDEBUG -fno-inline

# Estandar de C++ a usar
CXXSTD = c++98

# Pongo flags de C para C++ también
CXXFLAGS += $(CFLAGS)

# Uso enlazador de c++
CXXFLAGS += -std=$(CXXSTD)
LD = $(CXX)

# Agregar subcarpetas aqui de ser necesario
fuentes  = $(wildcard *.$(extension))
fuentes += $(wildcard arbol/*.$(extension))
fuentes += $(wildcard hash/*.$(extension))
fuentes += $(wildcard idxMasterfile/*.$(extension))
fuentes += $(wildcard RTT/*.$(extension))
fuentes += $(wildcard estadistica/*.$(extension))
fuentes += $(wildcard compresion/*.$(extension))

occ := $(CC)
ocxx := $(CXX)
orm := $(RM)
old := $(LD)
ifdef verbose
RM := $(RM) -v
else
CC =  @echo "  CC  $@"; $(occ)
CXX = @echo "  CXX $@"; $(ocxx)
RM =  @echo "  CLEAN"; $(orm)
LD =  @echo "  LD  $@"; $(old)
endif

# REGLAS
#########

.PHONY: all clean

all: $(target)

o_files = $(patsubst %.$(extension),%.o,$(fuentes))


%.deps: %.$(extension)
	@set -e; rm -f $@; \
		$(old) -MM -MG -MP $(CXXFLAGS) $(CFLAGS) $< -MF $@.$$$$; \
		sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
		rm -f $@.$$$$

-include $(o_files:.o=.deps)

$(target): $(o_files)
	@if [ -z "$(o_files)" ]; \
	then \
		echo "No hay archivos de entrada, recuerde que la extensión debe ser '.$(extension)'."; \
		false; \
	fi >&2
	$(LD) $(LDFLAGS) $(o_files) $(LOADLIBS) $(LDLIBS) -o $(target)

clean:
	$(RM) $(o_files) $(o_files:.o=.deps) $(target)

cleanFiles:
	cd archivos/; $(RM) *.dat; $(RM) *.bin
